<?php
/**
* @author nam J
* @authorurl ngonam22
* @copyright 2014
*/

if(!defined('BASEPATH'))
	exit('No direct script access allowed');

class AppController extends CI_Controller {
	public $data = array();
	public $layout = 'layout/back';
	public $prefix = null;
	public $paginate = array(
		'per_page' => 12, 'uri_segment' => 4, 'num_links' => 3,
		'first_link' => 'Trang đầu', 'last_link' => 'Trang cuối',
		'auto' => true,'link' => null,
		'full_tag_open' => '<ul class="pagination">',
		'full_tag_close' => '</ul>',
		'first_tag_open' => '<li class="first">',
		'first_tag_close' => '</li>',
		'last_tag_open' => '<li class="last">',
		'last_tag_close' => '</li>',
		'next_tag_open' => '<li class="next round">',
		'next_tag_close' => '</li>',
		'prev_tag_open' => '<li class="prev round">',
		'prev_tag_close' => '</li>',
		'cur_tag_open' => '<li class="active"><a href="#">',
		'cur_tag_close' => '</a></li>',
		'num_tag_open' => '<li>',
		'num_tag_close' => '</li>',
		'sort' => false,
		'sortBy' => 'id','sortOrder' => 'desc',
		'field' => '*','sortList' => array('stt'=>'id','id'=>'id')
	);
	public $log_config = array(
		'1' => array('description' => 'Thành viên <a href="/{prefix}/userinfo/index/{1}">{2}</a> đã xóa người dùng {3} ({4})',
			'explaination' => 'Xóa Người dùng'
			),
		'2' => array('description' => 'Thành viên <a href="/{prefix}/userinfo/index/{1}">{2}</a> đã xóa đơn hàng {3} ({4})',
			'explaination' => 'Xóa Đơn hàng'
			),
		'3' => array('description' => 'Thành viên <a href="/{prefix}/userinfo/index/{1}">{2}</a> đã xóa Sản phẩm {3} ({4})',
			'explaination' => 'Xóa Sản Phẩm'
			),
		'4' => array('description' => 'Thành viên <a href="/{prefix}/userinfo/index/{1}">{2}</a> đã xóa tin {3} ({4})',
			'explaination' => 'Xóa Tin'
			),
		'5' => array('description' => 'Thành viên <a href="/{prefix}/userinfo/index/{1}">{2}</a> đã xóa category {3} ({4})',
			'explaination' => 'Xóa category'
			),
		'6' => array('description' => 'Thành viên <a href="/{prefix}/userinfo/index/{1}">{2}</a> đã chấp nhận sản phẩm <a href="/{prefix}/product/edit/{4}">{3}</a> ({4})',
			'explaination' => 'Duyệt sản phẩm'
			),
		'7' => array('description' => 'Thành viên <a href="/{prefix}/userinfo/index/{1}">{2}</a> đã chấp nhận đơn hàng <a href="/{prefix}/cart/edit/{4}">{3}</a> ({4})',
			'explaination' => 'Duyệt đơn hàng'
			),
		'8' => array('description' => 'Thành viên <a href="/{prefix}/userinfo/index/{1}">{2}</a> đã chấp nhận Category <a href="/{prefix}/category/edit/{4}">{3}</a> ({4})',
			'explaination' => 'Duyệt Category'
			),
		'9' => array('description' => 'Thành viên <a href="/{prefix}/userinfo/index/{1}">{2}</a> đã chấp nhận tin <a href="/{prefix}/news/edit/{4}">{3}</a> ({4})',
			'explaination' => 'Duyệt tin'
			),
		'10' => array('description' => 'Thành viên <a href="/{prefix}/userinfo/index/{1}">{2}</a> đã cập nhật Sản phẩm {3} ({4})',
			'explaination' => 'Cập nhật Sản Phẩm'
			),
		'11' => array('description' => 'Thành viên <a href="/{prefix}/userinfo/index/{1}">{2}</a> đã cập nhật Tin tức {3} ({4})',
			'explaination' => 'Cập nhật Tin tức'
			),
		'12' => array('description' => 'Thành viên <a href="/{prefix}/userinfo/index/{1}">{2}</a> đã cập nhật Người dùng {3} ({4})',
			'explaination' => 'Cập nhật Người dùng'
			),
		'13' => array('description' => 'Thành viên <a href="/{prefix}/userinfo/index/{1}">{2}</a> đã cập nhật Giỏ hàng ({3})',
			'explaination' => 'Cập nhật Giỏ hàng'
			),
		'14' => array('description' => 'Thành viên <a href="/{prefix}/userinfo/index/{1}">{2}</a> đã cập Cấu hình {3} ({4})',
			'explaination' => 'Cập nhật Cấu hình'
			),
		'15' => array('description' => 'Thành viên <a href="/{prefix}/userinfo/index/{1}">{2}</a> đã xóa lịch sử {3} ({4})',
			'explaination' => 'Xóa lịch sử '
			),
	);

	public function __construct(){
		parent::__construct();
		$this->load->helper('common');
		$this->data['common'] = new common();
		

	}

	public function log($status = 1, $data = array()){
		$default = $this->log_config;
		if(empty($status) || empty($data) || empty($default[$status]))
			return false;

		$message = $default[$status]['explaination'];
        $message = str_replace('{prefix}', $this->prefix, $message);

        $i = 1;
        foreach($data as $v):
            $message = str_replace('{'.$i.'}', $v, $message);
            $i++;
        endforeach;

        $user = $this->getEM()->getRepository('Entity\ShLog')->saveLog($this->session->userdata('uid'), $status, $message);
        return true;
	}


	//lay doctrine ra de su dung
	public function getEM(){
		return $this->doctrine->em;
	}
	
	public function _remap($method, $params = array()){
		if(strpos($method,'admin_') === 0):
			if($this->uri->segment(1) == 'admin')
				$this->isLogin(3);
			else
				show_404();
			$this->prefix = 'admin';
		elseif(strpos($method,'mod_') === 0):
			if($this->uri->segment(1) == 'mod')
			   $this->isLogin(2);
			else
				show_404();

			$this->prefix = 'mod';

		else:
			$this->front();
		endif;

		if(method_exists($this,$method))
			return call_user_func_array(array($this,$method), $params);
		return show_404();
	}

	public function paginate($conf = array(), $auto = true){
		$start = $this->uri->segment($conf['uri_segment']);
		$start = $start ? $start : 0;
		$limit = $conf['per_page'];
		
		if(empty($limit))
			$limit = 10;
			
		if(empty($conf['condition']))
			$conf['condition'] = array();
			
		$sortBy = $this->paginate['sortBy'];
		$sortOrder = $this->paginate['sortOrder'];

		if($sortOrder != 'desc')
			$sortOrder = 'asc';
		else
			$sortOrder = 'desc';
			
		$this->load->library('pagination');
		$this->paginate = array_merge($this->paginate, $conf);

		$this->data['pagination_nullLink'] = $this->paginate['base_url'];
		if($this->paginate['sort'])
			$this->paginate['base_url'] .= '/'.$this->paginate['sortBy'].'/'.$this->paginate['sortOrder'];	

		$query = null;
		if(!empty($conf['get'])):
			$query = '?';
			foreach($conf['get'] as $k => $v)
				$query .= $k.'='.$v.'&';

			$this->pagination->first_url = '0'.$query;
		endif;

		$this->paginate['base_url'] = base_url($this->paginate['base_url']);
		
		$arr = array(
			'condition' => $conf['condition'],
			'limit' => $limit,
			'offset' => $start,
			'order' => array($sortBy => $sortOrder),
			'query' => $query
		);
		
		$arr = array_merge($arr, $this->paginate);
		return $arr;
	}

	private function front(){
		$this->layout = 'layout/front';

		$config = $this->getEM()->getRepository('Entity\ShConfig')->website(false);
		$this->data['config'] =  $config;
		if($config['website_status'] || $this->router->fetch_class() == 'user'):
			$this->layout = 'layout/front';
		else:
			$this->layout = null;
	        $this->render('layout/maintance');
	        $this->output->_display();
	        exit();
	    endif;
		
		$this->data['category'] = $this->getEM()->getRepository('Entity\ShCategory')->findBy(array(
				'active' => 1
			), array(
				'sort' => 'ASC',
				'name' => 'ASC'
			));
		$this->data['hot_news'] = $this->getEM()->getRepository('Entity\ShNews')->findBy(array(
			'active' => 1,
			'sticky' => 1
		), array(
			'id' => 'desc'
		));
		$this->data['top_new'] = $this->getEM()->getRepository('Entity\ShProduct')->findBy(
			array('status' => 1),array('id' => 'DESC'), 4,10
		);
		$this->getCartInfo();
	}

	private function getCartInfo(){
		$cart = $this->cart->contents();
		if(empty($cart)) return false;
		
		$data= array();
		foreach($cart as $v):
			$p = $this->getEM()->getRepository('Entity\ShProduct')->findOneById($v['id']);
			$img = $p->getImage();
			if(empty($img))
				$img = base_url('/assets/img/notfound.jpg');
			else
				$img = base_url('/assets/upload/thumbs/'.$img->getName());
			$data[] = array(
				'id' => $p->getId(),
				'name' => $p->getName(),
				'price' => $v['price'],
				'qty' => $v['qty'],
				'thumb' => $img
			);
		endforeach;
		
		$this->data['mini_cart'] = $data;
	}
	
	public function isAjax(){
		$ajax = $this->input->is_ajax_request();
		if($ajax):
			$this->layout = false;
			$this->data['ajax'] = true;
		else:
			$this->data['ajax'] = false;
		endif;
		return $ajax;
	}

	public function isLogin($role = 1){
		if(!$this->session->userdata('uid')):
			redirect('/user/login');
		else:
			if($this->session->userdata('uid') && $this->session->userdata('role')>= $role)
				return true;
			else
				redirect('/');
		endif;
		exit(show_404());
	}

	public function validation(){
		$CI =& get_instance();
		$this->load->library('form_validation');
	}

	public function captcha(){
		$this->load->helper('captcha');
		$conf = array(
			'word' => substr(strtolower(md5(time())), 0, 4),
			'img_path' => './assets/images/captcha/',
			'img_url' => base_url().'assets/images/captcha/',
			'font_path' => './assets/font/monofont.ttf',
			'img_width' => '110',
			'img_height' => '40',
			'expiration' => 60
		);

		$cap = create_captcha($conf);
		$this->session->set_userdata(array(
			'captcha_'.$cap['time'] => $cap['word']
		));

		if($this->input->is_ajax_request())
			exit($cap['time']);
		return $cap['time'];
	}
	
	protected function render($temp = null, $js = null, $css = null){
		if(!empty($js) && is_array($js))
			$this->data['js'] = $js;

		if(!empty($css) && is_array($css))
			$this->data['css'] = $css;

		//$this->data['common'] = new common;

		if(!empty($this->layout)):
			if(!empty($temp) && is_string($temp))
				$this->data['temp'] = $this->load->view($temp, $this->data, true);
			else
				$this->data['temp'] = null;

			$this->load->view($this->layout, $this->data);
		else:
			$this->load->view($temp, $this->data);
		endif;
	}
}